package top.lvjp.designMode;

import java.lang.reflect.Constructor;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

class God{

    // 构造方法私有化,其他人创建不了
    private God(){
        System.out.println("I am God!");
    }

    // volatile 关键字保证对象初始化指令不被重排

    private static volatile God god = null;


//    懒汉模式之 初始化加锁
    public static God getInstance(){
        if(god == null){                  // 缺陷
            synchronized (God.class){           //B线程恰好通过非空判断时,A创建god完成,然后释放锁,B继续创建god
                 god = new God();
            }
        }
        return god;
    }

//   懒汉模式之双重检测机制,
//    public static God getInstance(){
//        if(god == null){
//            synchronized (God.class){
//                if(god == null){
//                    god = new God();
//                }
//            }
//        }
//        return god;
//    }
}

//
//  静态内部类实现
//    private static class GodInner{
//        private static final God god = new God();
//    }
//    public static God getInstance(){
//        return GodInner.god;
//
//    }





public class SingletonTest {
    public static void main(String[] args) throws Exception {
        CyclicBarrier barrier = new CyclicBarrier(1000);

        Runnable r = ()->{
            try {
                barrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            God.getInstance();
        };

        // 1000个线程并发获取
        for (int i = 0; i < 1000; i++) {
            new Thread(r).start();
        }


//        通过反射获取多个对象
//        Constructor con = God.class.getDeclaredConstructor(null);
//        con.setAccessible(true);
//        God god1 = (God)con.newInstance(null);
//        God god2 = (God)con.newInstance(null);
//        System.out.println(god1.equals(god2));
    }
}
